//定义一个全局变量，用来存储所有的游戏对象，实现所有对象每一帧的更新
let MYGAMEOBJECTS = [];

//定义一个基类，所有的游戏对象都继承自这个类
class MyGameObject {
    constructor() {
        //将实例添加到全局变量MYGAMEOBJECTS中
        MYGAMEOBJECTS.push(this);
        //用来存储当前这帧和上一帧的时间差
        this.timedelta = 0;
        //表示游戏对象是否已经调用过start方法
        this.has_called_start = false;
    }

    //初始执行一次
    start() {

    }

    //每一帧都会执行
    update() {

    }

    //销毁游戏对象
    destroy() {
        //从全局变量MYGAMEOBJECTS中移除当前对象
        for (let i in MYGAMEOBJECTS) {
            if (MYGAMEOBJECTS[i] === this) {
                MYGAMEOBJECTS.splice(i, 1);
                brreak;
            }
        }
    }
}

// 上一帧的时间戳，用于记录上一次执行相关逻辑时的时间，
// 初始时它的值应该是未定义的（在代码开始执行前没有被赋值），后续会在函数中被更新赋值
let last_timestamp;

// 定义一个名为MYGAMEOBJECTSFRAME的函数，它接受一个参数timestamp，这个参数表示当前时间戳
// 该函数主要用于处理游戏对象（假设MYGAMEOBJECTS是一个游戏对象数组）每一帧的更新逻辑
let MYGAMEOBJECTSFRAME = (timestamp) => {
    // 遍历游戏对象数组MYGAMEOBJECTS中的每一个对象
    for (let obj of MYGAMEOBJECTS) {
        // 如果当前游戏对象还没有调用过start方法（可能意味着它还没开始初始化相关逻辑）
        if (!obj.has_called_start) {
            // 调用该游戏对象的start方法，进行一些初始化相关的操作，比如设置初始状态等
            obj.start();
            // 将该对象的has_called_start属性标记为true，表示已经调用过start方法了，下次就不会再重复调用start
            obj.has_called_start = true;
        } else {
            // 计算当前帧与上一帧的时间间隔（以时间戳差值来表示），
            // 这个时间间隔可以用于后续根据时间来更新游戏对象的状态等，比如移动的距离等与时间相关的计算
            obj.timedelta = timestamp - last_timestamp;
            // 调用游戏对象的update方法，基于计算出的时间间隔等因素来更新游戏对象的状态，比如更新位置、动画等
            obj.update();
        }
    }
    // 将当前的时间戳赋值给last_timestamp，以便在下一帧计算时间间隔时使用，更新上一帧时间戳记录
    last_timestamp = timestamp;
    // 请求浏览器在下一次重绘之前调用MYGAMEOBJECTSFRAME函数，实现游戏循环，不断更新游戏对象状态
    requestAnimationFrame(MYGAMEOBJECTSFRAME);
}

// 发起首次请求，让浏览器开始调用MYGAMEOBJECTSFRAME函数，启动整个游戏对象更新循环机制
requestAnimationFrame(MYGAMEOBJECTSFRAME);

export { MyGameObject }